/**
 *	流程模块接口事件，不写任何逻辑业务代码
 *	开发者：雨中磐石
 *	地址：www.rockoa.com
 *	日期：2023-07-19
 */

package com.framework.Flow;




import com.framerock.db.DBConn;
import com.framerock.server.Request;
import com.framerock.baselib.Rock;
import com.framerock.baselib.RockMsg;
import com.rock.xinhujava.RainRock;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Map;

/**
 *	流程模块接口事件，不写任何逻辑业务代码
 */
public class FlowListener {

    protected Flow mFlow;
    protected Request mRequest;
    protected DBConn nDb;
    protected String COMPANYID = "0";


    /**
     * 获取到模块接口文件对象
     * */
    public static FlowListener get(Flow flows, String num)
    {
        String group      = FlowGroup.get(num);
        FlowListener obj  = getObjectListener(num,group, "framework");
        if(obj == null && !Rock.isEmpt(RainRock.MYFOLDER)) {
            obj = getObjectListener(num,group, RainRock.MYFOLDER);
        }
        if(obj==null)obj  = new FlowListener();
        obj.setFlow(flows);
        return obj;
    }
    private static FlowListener getObjectListener(String num, String group, String folder)
    {
        String classna = "com."+folder+".Module";
        if(!Rock.isEmpt(group))classna += "."+group+"";
        classna += "."+num+".FlowListener"+num+"";
        try {
            Class<?> clazz = Class.forName(classna);
            Constructor<?> constructor = clazz.getDeclaredConstructor();
            FlowListener obj = (FlowListener)constructor.newInstance();
            return obj;
        } catch (Exception e) {
        }
        return null;
    }

    //设置对应flow
    public void setFlow(Flow flows)
    {
        mFlow           = flows;
        this.nDb        = mFlow.nDb;
        this.mRequest   = mFlow.mRequest;
        this.COMPANYID  = mRequest.COMPANYID;
    }



    //创建一个数据源
    protected ArrayList<Map<String, String>> storeList = null;
    protected void adddList(String value, String name){
    	adddList(value, name, "");
    }
    protected void adddList(String value, String name, String subname){
    	if(storeList==null)storeList = new ArrayList<Map<String, String>>();
        storeList.add(Rock.getMap(new String[]{"value",value, "name", name, "subname", subname}));
    }

    //-------以下是可重写的方法--------------

    /**
     * 是否有模块js默认不需要
     * */
    public Boolean onModejs() { return false;}

    /**
     * 是否需要单据提醒设置，默认都需要
     * */
    public Boolean onRemind() { return null;}

    /**
     * 单据提醒设置信息配置
     * */
    public Map<String, String> onRemindInfo() { return null;}

    /**
    * 到时间运行时调用
    * */
    public Map<String, String> onRemindRuning() { return null;}

    /**
     * 强制单位模式模块0默认,1系统模块,2强制单位模式,3不要单位模式
     * */
    public int onCompanymode() { return 0;}


    /**
     * 初始流程时调用
     * */
    public void oninitFlow() { }

    /**
     * 数据读取时替换
     * @param da 当前数据
     * @param lx lx=0默认,1详情展示，2列表显示
     * */
    public Map<String, String> onReplacers(Map<String, String> da, int lx) {
        return da;
    }

    /**
     * 编辑时替换
     * */
    public Map<String, String> onEditdatars(Map<String, String> da) {
        return da;
    }

    /**
     * 一些常用自定义方法
     * @param act 方法
     * @param params 参数
     * */
    public String onAction(String act, String params){return "";}

    /**
     * 数据源的
     * @param action 方法
     * @param params 参数
     * */
    public ArrayList<Map<String, String>> onStore(String action, String params){return null;}

    /**
     * 列表数据加载前处理
     * @return 返回Map数据有where条件，table表
     * */
    public Map<String, String> onDatabefore(){return null;}


    /**
     * 列表数据加载后处理
     * */
    public ArrayList<Map<String, String>> onDataafterList(ArrayList<Map<String, String>> rows){return rows;}


    /**
     * 列表页加载更多数据
     * */
    public Map<String, String> onDataafter(){return null;}

    /**
     * 单据保存之前处理
     * @param da 单据数据
     * @param mid 主id
     * @param isadd 当前是否添加
     * @return map返回判断内容
     * */
    public Map<String, String> onSavebefore(Map<String, String> da, String mid, Boolean isadd){return null;}

    /**
     * 单据保存之后处理
     * @param da 单据数据
     * @param mid 主id
     * @param isadd 当前是否添加
     * */
    public void onSaveafter(Map<String, String> da, String mid, Boolean isadd){}

    /**
     * 删除权限判断
     * */
    public Boolean onisDelete(){return null;}


    /**
     * 删除前处理返回内容就是把你删除
     * */
    public String onDeletebefore(){return "";}


    /**
     * 删除后处理
     * */
    public void onDeleteafter(){}

    /**
     * 编辑权限判断回调，默认null不设置
     * */
    public Boolean onisEdit(){return null;}

    /**
     * 查看权限判断回调，默认null不设置
     * */
    public Boolean onisView(){return null;}

    /**
     * 新增权限判断回调，默认null不设置
     * */
    public Boolean onisAdd(){return null;}

    /**
     * 是否需要评论，默认false不需要
     * */
    public Boolean onisPinlun(){return false;}

    /**
     * 单位添加模式时调用，一些初始化数据
     * */
    public void onFlowunitadd(){}

    /**
     * 定义流程模块条件
     * */
    public String ongetFlowwhere(String num){ return "";}

    /**
     * 默认排序
     * */
    public String onDefaultOrder(){ return "";}

    /**
     * 单据操作菜单获取运行之前
     * @param cdrs 菜单的信息
     * */
    public Map<String, String> onoptMenurunBefore(Map<String, String> cdrs){ return null;}

    /**
     * 首页处理数据
     * @param pnum 分组编号
     * */
    public Map<String, String> onhomeData(String pnum){ return null;}

    /**
     * 单据操作菜单获取运行之后
     * @param cdrs 菜单的信息
     * */
    public void onoptMenurunAfter(Map<String, String> cdrs){}

    /**
     * 角标读取
     * */
    public int ongetStotal(String pnum){return 0;}

    /**
     * 单元格保存之前
     * @param id 单据id
     * @param fields 字段
     * @param value 新的值
     * */
    public RockMsg onCellEditBefore(String id, String fields, String value) { return null; }

    /**
     * 单元格保存之后
     * @param id 单据id
     * @param fields 字段
     * @param value 新的值
     * */
    public void onCellEditAfter(String id, String fields, String value) { }

    /**
     * 字段处理
     * @param rows 字段内容
     * */
    public ArrayList<Map<String, String>> onFieldsArr(ArrayList<Map<String, String>> rows){ return rows;}

    /**
     * 是否需要审批
     * @param coursers 步骤信息
     * */
    public Boolean onFlowCourseJudge(Map<String, String> coursers){return null;}

    /**
     * 自定义审批人
     * @param coursers 步骤信息
     * @return 返回Map<人员id,人员姓名>
     * */
    public Map<String, String> onFlowCheckName(Map<String, String> coursers){return null;}

    /**
     * 流程审批完成
     * */
    public void onFlowCheckFinish(){}

    /**
     * 审批之前处理
     * @param coursers 步骤信息
     * */
    public Map<String, String> onFlowCheckBefore(Map<String, String> coursers){return null;}

    /**
     * 审批之后处理
     * @param coursers 步骤信息
     * */
    public void onFlowCheckAfter(Map<String, String> coursers){}
}
